package com.joyzone.weixin.util;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.URL;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;

import net.sf.json.JSONObject;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.joyzone.weixin.exception.WeixinException;

/**
 * 通用工具类
 * 
 * @author yulm
 * @date   2014-02-19
 */
public class CommonUtil {

	private static Logger log = LoggerFactory.getLogger(CommonUtil.class);
	
	// 凭证获取 (Get)
	public final static String token_url = Constants.URL_Get_Access_Token;
	

	/**
	 * 发送httpsq请求
	 * 
	 * @param requestUrl 请求地址
	 * @param requestMethod 请求方式(get/post)
	 * @param outputStr 请求字符串
	 */
	public static String httpsRequest(String requestUrl, String requestMethod, String outputStr){
		String document = null;
		try{
			// 创建 SSLContext 对象，并使用指定的信任管理器初始化
			TrustManager[] tm = {new MyX509TrustManager()};
			SSLContext sslContext = SSLContext.getInstance("SSL","SunJSSE");
			sslContext.init(null, tm, new java.security.SecureRandom());
			// 从上述SSLContext对象中得到SSLSocketFactory对象
			SSLSocketFactory ssf = sslContext.getSocketFactory();
			
			URL url = new URL(requestUrl);
			HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
			conn.setSSLSocketFactory(ssf);
			
			conn.setDoOutput(true);
			conn.setDoInput(true);
			conn.setUseCaches(false);
			
			// 设置请求方式(get/post)
			conn.setRequestMethod(requestMethod);
			
			// 当outputStr不为null时，向输出流写数据
			if (null != outputStr) {
				OutputStream outputStream = conn.getOutputStream();
				// 注意编码格式
				outputStream.write(outputStr.getBytes("UTF-8"));
				outputStream.close();
			}
			
			// 从输入流读取返回内容
			InputStream inputStream = conn.getInputStream();
			InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"UTF-8");
			BufferedReader bufferReader = new BufferedReader(inputStreamReader);
			String str = null;
			StringBuffer buffer = new StringBuffer();
			while ((str = bufferReader.readLine())!=null){
				buffer.append(str);
			}
			
			// 释放资源
			bufferReader.close();
			inputStreamReader.close();
			inputStream.close();
			inputStream = null;
			conn.disconnect();
			document = buffer.toString();
			
		} catch (ConnectException ce){
			log.error("连接超时:{}",ce);
		} catch (Exception e){
			log.error("https请求异常:{}",e);
		}
		return document;
	}

	/**
	 * 发送httpsq请求
	 * 
	 * @param requestUrl 请求地址
	 * @param requestMethod 请求方式(get/post)
	 * @param outputStr (通过JSONObject.get(key)的方式获取JSON对象的属性值)
	 * @throws WeixinException 
	 */
	public static JSONObject httpsRequest2Json(String requestUrl, String requestMethod, String outputStr) throws WeixinException{
		return StringUtil.stringToJson(httpsRequest(requestUrl, requestMethod, outputStr).toString());
	}
}
